package com.lujieni.aviator.demos;

import com.googlecode.aviator.runtime.function.AbstractFunction;
import com.googlecode.aviator.runtime.function.FunctionUtils;
import com.googlecode.aviator.runtime.type.AviatorBoolean;
import com.googlecode.aviator.runtime.type.AviatorObject;

import java.util.Map;

/**
 * 自定义 Between 函数
 * 用法: between(value, min, max)
 * 功能: 判断 value 是否在 min 和 max 之间（包含边界）
 */
public class BetweenFunction extends AbstractFunction {

    @Override
    public String getName() {
        return "between";
    }

    @Override
    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3) {
        // 获取参数值
        Number value = FunctionUtils.getNumberValue(arg1, env);
        Number min = FunctionUtils.getNumberValue(arg2, env);
        Number max = FunctionUtils.getNumberValue(arg3, env);

        // 转换为double进行比较
        double val = value.doubleValue();
        double minVal = min.doubleValue();
        double maxVal = max.doubleValue();

        // 判断是否在范围内（包含边界）
        boolean result = val >= minVal && val <= maxVal;

        return AviatorBoolean.valueOf(result);
    }

    /**
     * 重载方法，支持不同参数数量的调用
     */
    public AviatorObject call(Map<String, Object> env, AviatorObject... args) {
        if (args.length != 3) {
            throw new IllegalArgumentException("between函数需要3个参数: between(value, min, max)");
        }
        return call(env, args[0], args[1], args[2]);
    }
}
